package com.bank.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bank.entity.CardInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

/**
 * 银行卡信息数据访问层接口
 * 继承MyBatis Plus的BaseMapper，提供基础CRUD操作
 * 
 * @author 开发团队
 * @version 1.0.0
 * @since 2025-06-19
 */
@Mapper
public interface CardInfoMapper extends BaseMapper<CardInfo> {

    /**
     * 根据客户ID查询银行卡列表
     * 
     * @param customerId 客户ID
     * @return 银行卡列表
     */
    List<CardInfo> selectByCustomerId(@Param("customerId") Integer customerId);

    /**
     * 根据客户姓名模糊查询银行卡
     * 
     * @param customerName 客户姓名
     * @return 银行卡列表
     */
    List<CardInfo> selectByCustomerNameLike(@Param("customerName") String customerName);

    /**
     * 根据开卡日期范围查询银行卡
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 银行卡列表
     */
    List<CardInfo> selectByOpenDateRange(@Param("startDate") LocalDate startDate, 
                                        @Param("endDate") LocalDate endDate);

    /**
     * 根据余额范围查询银行卡
     * 
     * @param minBalance 最小余额
     * @param maxBalance 最大余额
     * @return 银行卡列表
     */
    List<CardInfo> selectByBalanceRange(@Param("minBalance") BigDecimal minBalance, 
                                       @Param("maxBalance") BigDecimal maxBalance);

    /**
     * 分页查询银行卡信息（支持多条件组合查询，关联客户和存款类型信息）
     * 
     * @param page 分页参数
     * @param cardId 卡号（可选，精确查询）
     * @param customerName 客户姓名（可选，模糊查询）
     * @param savingId 存款类型ID（可选）
     * @param isReportLoss 是否挂失（可选）
     * @param startDate 开卡开始日期（可选）
     * @param endDate 开卡结束日期（可选）
     * @param minBalance 最小余额（可选）
     * @param maxBalance 最大余额（可选）
     * @return 分页结果
     */
    IPage<CardInfo> selectPageWithConditions(Page<CardInfo> page,
                                            @Param("cardId") String cardId,
                                            @Param("customerName") String customerName,
                                            @Param("savingId") Integer savingId,
                                            @Param("isReportLoss") Boolean isReportLoss,
                                            @Param("startDate") LocalDate startDate,
                                            @Param("endDate") LocalDate endDate,
                                            @Param("minBalance") BigDecimal minBalance,
                                            @Param("maxBalance") BigDecimal maxBalance);

    /**
     * 根据卡号查询银行卡详细信息（关联客户和存款类型）
     * 
     * @param cardId 卡号
     * @return 银行卡详细信息
     */
    CardInfo selectDetailByCardId(@Param("cardId") String cardId);

    /**
     * 验证银行卡密码
     * 
     * @param cardId 卡号
     * @param password 密码
     * @return 匹配的记录数
     */
    int validatePassword(@Param("cardId") String cardId, @Param("password") String password);

    /**
     * 更新银行卡余额
     * 
     * @param cardId 卡号
     * @param newBalance 新余额
     * @return 影响行数
     */
    int updateBalance(@Param("cardId") String cardId, @Param("newBalance") BigDecimal newBalance);

    /**
     * 更新银行卡密码
     * 
     * @param cardId 卡号
     * @param newPassword 新密码
     * @return 影响行数
     */
    int updatePassword(@Param("cardId") String cardId, @Param("newPassword") String newPassword);

    /**
     * 更新银行卡挂失状态
     * 
     * @param cardId 卡号
     * @param isReportLoss 挂失状态
     * @return 影响行数
     */
    int updateReportLossStatus(@Param("cardId") String cardId, @Param("isReportLoss") Boolean isReportLoss);

    /**
     * 检查卡号是否已存在
     * 
     * @param cardId 卡号
     * @return 存在的记录数
     */
    int countByCardId(@Param("cardId") String cardId);

    /**
     * 生成新的银行卡号（基于前缀和序号）
     * 
     * @param prefix 卡号前缀
     * @return 新的银行卡号
     */
    String generateNewCardId(@Param("prefix") String prefix);

    /**
     * 获取银行卡统计信息
     * 
     * @return 银行卡总数
     */
    int selectTotalCount();

    /**
     * 获取挂失银行卡数量
     * 
     * @return 挂失银行卡数量
     */
    int selectReportLossCount();

    /**
     * 获取总余额统计
     * 
     * @return 所有银行卡余额总和
     */
    BigDecimal selectTotalBalance();

    /**
     * 批量删除银行卡（需要检查余额）
     * 
     * @param cardIds 银行卡号列表
     * @return 影响行数
     */
    int batchDeleteByIds(@Param("cardIds") List<String> cardIds);
}
